package top.minishow.pdf.utils;

import java.io.File;

/**
 * @author hhewanning
 * @date 2019/3/18
 * @description html转pdf
 */
public class HtmlToPdf {

    /**
     * @param toPdfTool wkhtmltopdf在系统中的路径
     * @param srcPath   html路径，可以是硬盘上的路径，也可以是网络路径
     * @param destPath  destPath pdf保存路径
     * @return boolean 转换成功返回true
     * @author hewanning
     * @date 2019/3/19
     * @description html转pdf
     * @modifier
     */
    public static boolean convert(String toPdfTool, String srcPath, String destPath) {
        File file = new File(destPath);
        File parent = file.getParentFile();
        // 如果pdf保存路径不存在，则创建路径
        if (!parent.exists()) {
            parent.mkdirs();
        }
        StringBuilder cmd = new StringBuilder();
        if (System.getProperty("os.name").indexOf("Windows") == -1) {
            // 非windows 系统
            toPdfTool = "wkhtmltopdf";
        }
        cmd.append(toPdfTool);
        cmd.append(" ");
        //页眉中间内容
//        cmd.append(" --header-center 这里是页眉这里是页眉这里是页眉这里是页眉 ");
        // 设置页面上边距 (default 10mm)
        cmd.append("  --margin-top 5mm ");
        cmd.append("  --margin-left 5mm ");
        cmd.append("  --margin-right 5mm ");
        cmd.append("  --margin-bottom 7mm ");
        // (设置页眉和内容的距离,默认0)
//        cmd.append(" --header-spacing 5 ");
        //设置在中心位置的页脚内容
        cmd.append(" --footer-center 第[page]页／共[topage]页 ");
        // (设置页脚和内容的距离,默认0)
//        cmd.append(" --footer-spacing 5 ");
        // 不使用智能缩放策略
        cmd.append(" --disable-smart-shrinking ");
        cmd.append(" --dpi 400 ");
        cmd.append(srcPath);
        cmd.append(" ");
        cmd.append(destPath);
        boolean result = true;
        Process proc = null;
        try {
            proc = Runtime.getRuntime().exec(cmd.toString());
            HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());
            HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());
            error.start();
            output.start();
            proc.waitFor();
        } catch (Exception e) {
            result = false;
            e.printStackTrace();
        } finally {
            if (proc != null) {
                proc.destroy();
            }
        }
        return result;
    }
}
